/**
 * @file MeshProcessor.h
 * @brief 网格处理器类的声明
 * 
 * 提供了角点网格到有限元网格的转换功能，特性包括：
 * 1. 高性能网格数据读取和处理
 * 2. 并行化的网格转换
 * 3. 自动检测和处理断层
 * 4. SIMD优化的数值计算
 * 5. 内存优化的数据结构
 */
#pragma once
#include <string>
#include "GridStructs.h"

class MeshProcessor {
public:
    /**
     * @brief 构造函数
     * @param input_file 输入网格文件路径
     * @param output_file 输出VTK文件路径
     */
    MeshProcessor(const std::string &input_file,
                 const std::string &output_file);

    /**
     * @brief 执行网格处理的主函数
     * @throw std::exception 当处理过程中出现错误时抛出异常
     * 
     * 处理流程：
     * 1. 读取角点网格数据
     * 2. 转换为有限元网格
     * 3. 检测和处理断层
     * 4. 保存VTK格式结果
     */
    void process();

private:
    std::string input_file;   ///< 输入文件路径
    std::string output_file;  ///< 输出文件路径
    
    GridData grid_data;       ///< 原始网格数据
    ProcessedData result;     ///< 处理后的数据

    /**
     * @brief 检查单元是否退化为三棱柱
     * @param nodes 节点数据
     * @param hex 六面体单元节点列表
     * @param prism_nodes 输出参数，存储三棱柱节点列表
     * @param fault_nodes 输出参数，存储断层节点编号
     * @return 如果单元退化则返回true
     * 
     * 检测策略：
     * 1. 分析单元面的共面性
     * 2. 识别退化模式
     * 3. 重组节点列表
     */
    bool isDegeneratedToPrism(const std::vector<std::vector<double>> &nodes,
                             const std::vector<int> &hex,
                             std::vector<int> &prism_nodes,
                             std::set<int> &fault_nodes);

    /**
     * @brief 将六面体单元转换为四面体单元
     * @param hex 六面体单元节点列表
     * @return 返回转换后的四面体单元列表
     * 
     * 转换策略：
     * 1. 使用标准分割模式
     * 2. 保持单元质量
     * 3. 避免退化单元
     */
    std::vector<std::vector<int>> hexToTets(const std::vector<int> &hex);

    /**
     * @brief 将三棱柱单元转换为四面体单元
     * @param prism 三棱柱单元节点列表
     * @return 返回转换后的四面体单元列表
     * 
     * 转换策略：
     * 1. 使用标准分割模式
     * 2. 保持单元质量
     * 3. 避免退化单元
     */
    std::vector<std::vector<int>> prismToTets(const std::vector<int> &prism);

    /**
     * @brief 处理单个网格单元
     * @param nodes 节点数据
     * @param hex 六面体单元节点列表
     * @param result 处理结果数据
     * @return 返回生成的四面体单元列表
     * 
     * 处理流程：
     * 1. 检查单元是否退化
     * 2. 选择合适的转换方法
     * 3. 生成四面体单元
     */
    std::vector<std::vector<int>> processElement(
        const std::vector<std::vector<double>> &nodes,
        const std::vector<int> &hex,
        ProcessedData &result);

    // ... 其他辅助函数声明 ...
}; 